package com.sinog.alarm.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

/**
 * @desc fileUtil类
 * @author wangxj
 * @date 2022-11-09 16:36
 */
@Slf4j
public class FileUtil {

    /**
     * 获取指定文件夹下所有文件，不含文件夹里的文件
     *
     * @param dirFilePath 文件夹路径
     * @return
     */
    public static List<File> getAllFile(String dirFilePath) {
        if (StringUtils.isBlank(dirFilePath)) {
            return null;
        }
        return getAllFile(new File(dirFilePath));
    }

    /**
     * 获取指定文件夹下所有文件，不含文件夹里的文件
     * @param dirFile 文件夹
     * @return List<File>
     */
    public static List<File> getAllFile(File dirFile) {
        // 如果文件夹不存在或着不是文件夹，则返回 null
        if (Objects.isNull(dirFile) || !dirFile.exists() || dirFile.isFile()) {
            return null;
        }
        File[] childrenFiles = dirFile.listFiles();
        if (Objects.isNull(childrenFiles) || childrenFiles.length == 0) {
            return null;
        }
        List<File> files = new ArrayList<>();
        for (File childFile : childrenFiles) {
            // 如果是文件，直接添加到结果集合
            if (childFile.isFile()) {
                files.add(childFile);
            }
        }
        return files;
    }

    /**
     * 获取文件的byte数组
     * @param file 文件
     * @return byte[] byte数组
     * @throws IOException
     */
    public static byte[] getFileByte(File file) throws IOException {
        byte[] bytes = null;
        FileInputStream fis = null;
        ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
        try {
            fis = new FileInputStream(file);
            byte[] b = new byte[1024];
            int n;
            while((n = fis.read(b)) != -1) {
                bos.write(b,0,n);
            }
            bytes = bos.toByteArray();
        } catch(IOException e) {
            log.debug("发生异常:{}",e);
        } finally {
            if (fis != null){
                fis.close();
            }
            bos.close();
        }
        return bytes;
    }

    /**
     * 复制单个文件
     * @param oldPath String 原文件路径 如：c:/fqf.txt
     * @param newPath String 复制后路径 如：f:/fqf.txt
     * @param fileName String 新文件名
     */
    public static void copyFile(String oldPath,String newPath,String fileName) {
        File newFile = new File(newPath);
        if(!newFile.exists()) {
            try {
                newFile.mkdirs();
            } catch(RuntimeException e) {
                log.error(e.getMessage());
            }
        }
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            int byteread;
            File oldfile = new File(oldPath);
            //文件存在时
            if(oldfile.exists()) {
                //读入原文件
                fis = new FileInputStream(oldPath);
                fos = new FileOutputStream(newPath + File.separator + fileName);
                byte[] buffer = new byte[1444];
                while((byteread = fis.read(buffer)) != -1) {
                    fos.write(buffer,0,byteread);
                }
                fis.close();
            }
        } catch(Exception e) {
            log.error("复制单个文件操作出错:",e);
        } finally {
            if(null != fis) {
                try {
                    fis.close();
                } catch(IOException e) {
                    log.error("发生异常:",e);
                }
            }
            if(null != fos) {
                try {
                    fos.close();
                } catch(IOException e) {
                    log.error("发生异常:",e);
                }
            }
        }
    }
}